#ifndef KEY_H
#define KEY_H

#include <Arduino.h>

/* 按键去抖动时间(ms) */
#define DEBOUNCE_TIME   50    // 去抖动时间，避免按键抖动导致错误触发
#define LONG_PRESS_TIME 1000  // 长按时间，超过此时间被认为是长按

/* 按键事件回调函数类型 */
typedef void (*KeyEventCallback)(void);

/* 按键状态 */
enum KeyState {
  KEY_STATE_IDLE = 0,        // 空闲状态（按键未按下）
  KEY_STATE_SHORT_PRESS,     // 短按状态（按键按下后立即释放）
  KEY_STATE_LONG_PRESS       // 长按状态（按键按下持续时间超过长按时间）
};

/**
 * @brief 按键句柄结构体
 * @details 包含按键的状态、按下时间和事件回调函数指针。
 */
typedef struct {
  uint8_t          pin;                         // 按键引脚
  KeyState         swichKeyState;               // 开关按键状态
  unsigned long    swichKeyPressTime;           // 开关按键按下时间（用于计算长按时间）
  KeyEventCallback swichKeyShortPressCallback;  // 开关短按事件回调函数指针
  KeyEventCallback swichKeyLongPressCallback;   // 开关长按事件回调函数指针
} KeyHandle;

#ifdef __cplusplus
extern "C" {
#endif

void key_init(KeyHandle* handle, uint8_t pin);  // 初始化按键
void key_state_machine(KeyHandle* handle);      // 按键处理（状态机）

void key_short_press_event_register(KeyHandle* handle, KeyEventCallback callback);  // 注册短按事件回调
void key_long_press_event_register(KeyHandle* handle, KeyEventCallback callback);   // 注册长按事件回调

#ifdef __cplusplus
}
#endif

#endif // KEY_H